import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

pd.set_option('display.max_rows', None, 'display.max_columns', None, 'display.max_colwidth', 1000)


def sep(label=''):
    """Utility function to print a separator line."""
    print('-' * 32, label, '-' * 32, sep='')


# 1.	对hour.csv数据进行如下操作
# (1)	读取数据信息（5分）
df = pd.read_csv(r'../../../large_data/共享单车/hour.csv')
m = len(df)

# (2)	打印前5行信息（5分）
sep('打印前5行信息')
print(df.head(5))

# (3)	打印数据信息（5分）
sep('打印数据信息')
print(df.info())

# (4)	打印数据描述（5分）
sep('打印数据描述')
print(df.describe())

# (5)	判定instant是否是索引列（10分）
sep('判定instant是否是索引列')
col = df['instant']
xmin = col.min()
xmax = col.max()
xvar = col.var()
xmean = col.mean()
xex = (xmax + xmin) / 2
xdx = (xmax - xmin)**2 / 12
print(f'E(X) = {xex:,.4f}, D(X) = {xdx:,.4f}')
print(f'mean = {xmean:,.4f}, var = {xvar:,.4f}')
print('可见instant列符合均匀分布，可以认为是索引列')
del df['instant']

# (6)	将所有连续特征和标签cnt比较皮尔逊系数并用热图显示（10分）
sep('将所有连续特征和标签cnt比较皮尔逊系数并用热图显示')
x = df[['temp', 'atemp', 'hum', 'windspeed', 'casual', 'registered', 'cnt']]
xm = len(x)
xcorr = x.corr()
print(xcorr)
print(xcorr >= 0.6)
ax = sns.heatmap(xcorr, annot=True)
bottom, top = ax.get_ylim()  # ATTENTION fix heatmap
ax.set_ylim(bottom + 0.5, top - 0.5)
plt.show()

# (7)	删除掉认为没有的特征（5分）
del df['atemp']
del df['casual']
del df['registered']

# (8)	对离散特征进行独热编码处理（10分）
df = pd.get_dummies(df, columns=['season', 'holiday', 'weekday', 'workingday', 'weathersit'])

# (9)	使用标准化处理连续特征（10分）
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
x = df[['temp', 'hum', 'windspeed']]
std = scaler.fit_transform(x)

# (10)	删除掉处理前的连续特征（5分）
df[['temp', 'hum', 'windspeed']] = std

# (11)	将数据切分为x，y，使用留出法切分7:3（10分）
del df['dteday']
x = df.iloc[:, :-1]
y = df.iloc[:, -1]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=666)

# (12)	创建线性回归，进行模型的预测处理（10分）
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train, y_train)
print(f'Training score = {model.score(x_train, y_train)}')
print(f'Testing score = {model.score(x_test, y_test)}')

# (13)	打印mse，mae，r方（10分）
h_test = model.predict(x_test)
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
print(f'mse = {mean_squared_error(y_test, h_test)}')
print(f'mae = {mean_absolute_error(y_test, h_test)}')
print(f'r方 = {r2_score(y_test, h_test)}')
